#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string>
#include <cstring>

#define N 2
#define SIZE 1024

using namespace std;

int main()
{
    int pipefd[N] = {0};
    if(pipe(pipefd) < 0)
    {
        return 1;
    }

    pid_t id = fork();
    if(id < 0)
    {
        return 2;
    }

    //child
    if(id == 0)
    {
        //char buffer[SIZE] = {0};
        // const char* s = "I am child process!";
        char c = 'c';
        close(pipefd[0]);
        
        //int count = 10;
        int cnt = 0;
        while(true)
        {
            write(pipefd[1], &c, 1);
            printf("cnt: %d\n", cnt++);
        }
                
        close(pipefd[1]);

       // exit(0);
    }

    //father
    //close(pipefd[1]);
    char ch;
    close(pipefd[1]);
    //close(pipefd[0]);

    //ssize_t n = read(pipefd[1], &ch, 1);
    // if(n > 0)
    // {
    //     cout << ch << endl;
    // }

    int status = 0;
    waitpid(id, &status, 0);

    // if(rid > 0)
    // {
    //     printf("signal kill: %d\n", status & 0x7F);
    // }
    close(pipefd[0]);

    return 0;

}


// void writer(int wfd)
// {
//     char buffer[SIZE]; //缓冲区

//     string str = "Hello World!!!";
//     pid_t id = getpid();
//     int number = 0;

//     int count = 10;
//     while(true)
//     {
//         sleep(1);
//         buffer[0] = '\0';
//         snprintf(buffer, sizeof(buffer), "%s-%d-%d", str.c_str(), ++number, id);
//         // cout << buffer << endl;
//         write(wfd, buffer, sizeof(buffer));
//     }
// }

// void reader(int rfd)
// {
//     char buffer[SIZE];

//     int count = 10;
//     while(true)
//     {
//         buffer[0] = '\0';
//         ssize_t n = read(rfd, buffer, sizeof(buffer));
//         if(n > 0) 
//         {
//             buffer[n] = '\0'; //使用的数组，需要结束标记
//             cout << "father get a message [" << getpid() << "]: " << buffer << endl;
//         }
//         else if(n == 0)
//         {
//             cout << "father read fail!!!" << endl;
//             break;
//         }
//         else break;
//     }
// }

// int main()
// {
//     int pipefd[N];
//     if(pipe(pipefd))
//     {
//         perror("main::pipe");
//         return 1;
//     }

//     pid_t id = fork();
//     if(id < 0) return 2;

//     if(id == 0)
//     {
//         //子进程读，关闭写端
//         close(pipefd[1]);
//         reader(pipefd[0]);
//         close(pipefd[0]);

//         exit(0);
//     }

//     //父进程写，关闭读端
//     close(pipefd[0]);
//     writer(pipefd[1]);
    
//     //父进程等待子进程退出
//     waitpid(id, nullptr, 0);
    
//     close(pipefd[1]);
//     return 0;
// }

// int main()
// {
// 	int fd[N] = { 0 };
// 	if (pipe(fd) < 0){ //使用pipe创建匿名管道
// 		perror("pipe");
// 		return 1;
// 	}
// 	pid_t id = fork(); //使用fork创建子进程
// 	if (id == 0){
// 		//child
// 		close(fd[0]); //子进程关闭读端
// 		//子进程向管道写入数据
// 		const char* msg = "hello father, I am child...";
// 		int count = 10;
// 		while (count--){
// 			write(fd[1], msg, strlen(msg));
// 			sleep(1);
// 		}
// 		close(fd[1]); //子进程写入完毕，关闭文件
// 		exit(0);
// 	}
// 	//father
// 	close(fd[1]); //父进程关闭写端
// 	//父进程从管道读取数据
// 	char buff[SIZE];
// 	while (1){
// 		ssize_t s = read(fd[0], buff, sizeof(buff));
// 		if (s > 0){
// 			buff[s] = '\0';
// 			printf("child send to father:%s\n", buff);
// 		}
// 		else if (s == 0){
// 			printf("read file end\n");
// 			break;
// 		}
// 		else{
// 			printf("read error\n");
// 			break;
// 		}
// 	}
// 	close(fd[0]); //父进程读取完毕，关闭文件
// 	waitpid(id, NULL, 0);
// 	return 0;
// }

// void writer(int wfd)
// {
//     char buffer[SIZE]; //缓冲区

//     string str = "Hello World!!!";
//     pid_t id = getpid();
//     int number = 0;

//     int count = 10;
//     while(count--)
//     {
//         sleep(1);
//         buffer[0] = '\0';
//         snprintf(buffer, sizeof(buffer), "%s-%d-%d", str.c_str(), ++number, id);
//         // cout << buffer << endl;
//         write(wfd, buffer, sizeof(buffer));
//     }
// }

// void reader(int rfd)
// {
//     char buffer[SIZE];

//     int count = 10;
//     while(count--)
//     {
//         buffer[0] = '\0';
//         ssize_t n = read(rfd, buffer, sizeof(buffer));
//         if(n > 0) 
//         {
//             buffer[n] = '\0'; //使用的数组，需要结束标记
//             cout << "father get a message [" << getpid() << "]: " << buffer << endl;
//         }
//         else if(n == 0)
//         {
//             cout << "father read fail!!!" << endl;
//             break;
//         }
//         else break;
//     }
// }

// int main()
// {
//     int pipefd[N];
//     if(pipe(pipefd))
//     {
//         perror("main::pipe");
//         return 1;
//     }

//     pid_t id = fork();
//     if(id < 0) return 2;

//     if(id == 0)
//     {
//         //子进程读，关闭写端
//         close(pipefd[1]);
//         reader(pipefd[0]);
//         close(pipefd[0]);

//         exit(0);
//     }

//     //父进程写，关闭读端
//     close(pipefd[0]);
//     writer(pipefd[1]);
    
//     //父进程等待子进程退出
//     pid_t rid = waitpid(id, nullptr, 0);
//     // if(rid < 0) return 3;
//     // else cout << "等待成功！" << endl;
    
//     close(pipefd[1]);
//     return 0;
// }





// void Writer(int wfd)
// {
//     string s = "hello world!!!";
//     pid_t self = getpid();
//     int number = 0;

//     char buffer[SIZE];

//     while(true)
//     {
//         sleep(1);

//         buffer[0] = 0;
//         snprintf(buffer, sizeof(buffer), "%s-%d-%d", s.c_str(), self, number++);
//         cout << buffer << endl;
//         write(wfd, buffer, sizeof(buffer)); 
//         char c = 'c';
//         write(wfd, &c, 1);
//         ++number;
//         cout << number << endl;
//         if(number >= 5) break;
//     }
// }

// void Reader(int rfd)
// {
//     char buffer[SIZE];

//     while(true)
//     {
//         buffer[0] = 0;

//         ssize_t n = read(rfd, buffer, sizeof(buffer));

//         if(n > 0)
//         {
//             buffer[n] = '\0';
//             cout << "father get a message[" << getpid() << "]" << buffer << endl;
//         }
//         else if(n == 0)
//         {
//             printf("father read file done!\n");
//             break;
//         }
//         else break;
//     }
// }

// int main()
// {
//     int pipefd[N] = {0};
//     int n = pipe(pipefd);
//     if(n < 0)
//     return 1;

//     //child-->写 parent-->读
//     pid_t id = fork();
//     if(id < 0)
//     return 1;

//     //child
//     if(id == 0)
//     {
//         //关闭读
//         close(pipefd[0]);
//         Writer(pipefd[1]);

//         exit(0);
//     }

//     //parent 关闭写
//     close(pipefd[1]);
//     Reader(pipefd[0]);

//     //父进程回收子进程
//     pid_t rid = waitpid(id, nullptr, 0);
//     if(rid < 0)
//     return 1;

//     close(pipefd[0]);

//     sleep(5);

//     return 0;
// }


